# build.py - 完整的打包脚本
# AIGC By ChatGPT
# 该代码已弃用 留作参考
import os
import sys
import shutil
import subprocess
import tempfile

def check_dependencies():
    """检查必要的依赖"""
    required_packages = ['pyinstaller', 'requests', 'pywin32']
    missing_packages = []
    
    for package in required_packages:
        try:
            __import__(package.replace('-', '_'))
        except ImportError:
            missing_packages.append(package)
    
    if missing_packages:
        print("❌ 缺少必要的依赖包:")
        for package in missing_packages:
            print(f"   - {package}")
        print("\n正在安装依赖...")
        
        for package in missing_packages:
            try:
                subprocess.check_call([sys.executable, "-m", "pip", "install", package])
                print(f"✅ 已安装 {package}")
            except subprocess.CalledProcessError:
                print(f"❌ 安装 {package} 失败")
                return False
    
    return True

def create_spec_file():
    """创建PyInstaller spec文件"""
    spec_content = '''# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[
        'win32pipe',
        'win32file',
        'pywintypes',
        'etbox_service',
        'etbox_client', 
        'etbox_gui'
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='ETBOXUploader',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    
)
'''
    
    with open('ETBOXUploader.spec', 'w', encoding='utf-8') as f:
        f.write(spec_content)
    
    print("✅ 已创建 spec 文件")

def build_with_pyinstaller():
    """使用PyInstaller打包"""
    print("🚀 开始打包...")
    
    # 清理之前的构建
    for folder in ['build', 'dist']:
        if os.path.exists(folder):
            shutil.rmtree(folder)
            print(f"✅ 已清理 {folder} 目录")
    
    # 创建spec文件
    create_spec_file()
    
    # 执行打包
    try:
        cmd = ['pyinstaller', 'ETBOXUploader.spec', '--clean']
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 打包成功完成!")
            
            # 检查生成的文件
            exe_path = os.path.join('dist', 'ETBOXUploader.exe')
            if os.path.exists(exe_path):
                file_size = os.path.getsize(exe_path) / (1024 * 1024)
                print(f"📦 生成文件: {exe_path}")
                print(f"📏 文件大小: {file_size:.2f} MB")
                
                # 创建使用说明
                create_readme()
                create_install_script()
                
                return True
            else:
                print("❌ 错误: 未找到生成的可执行文件")
                return False
        else:
            print(f"❌ 打包失败: {result.stderr}")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"❌ 打包过程出错: {e}")
        if e.stderr:
            print(f"错误信息: {e.stderr}")
        return False
    except FileNotFoundError:
        print("❌ 错误: 未找到PyInstaller")
        return False

def create_readme():
    """创建使用说明文档"""
    readme_content = '''# ETBOX上传工具 - 使用说明

## 功能特点
- 🚀 后台服务架构，稳定可靠
- 📤 带进度显示的文件上传
- 📌 右键菜单快速上传
- 🖥️ 图形化配置界面
- 🔧 服务状态监控

## 安装使用

### 方法一：一键安装（推荐）
1. 运行 `安装ETBOX工具.bat`
2. 程序会自动配置并启动

### 方法二：手动配置
1. 运行 `ETBOXUploader.exe gui` 打开配置界面
2. 点击"启动后台服务"
3. 点击"添加右键菜单"
4. 现在可以在文件上右键选择"上传到ETBOX"

### 方法三：命令行使用
- 启动服务: `ETBOXUploader.exe service`
- 上传文件: `ETBOXUploader.exe upload "文件路径"`
- 打开GUI: `ETBOXUploader.exe gui`

## 文件说明
- `ETBOXUploader.exe` - 主程序
- `安装ETBOX工具.bat` - 一键安装脚本
- `使用说明.txt` - 本文档

## 系统要求
- Windows 7/10/11
- .NET Framework 4.5+
- ETBOX服务运行在8812端口

## 技术支持
确保ETBOX服务正常运行在8812端口。
如有问题，请检查防火墙设置。
'''
    
    with open('使用说明.txt', 'w', encoding='utf-8') as f:
        f.write(readme_content)
    print("✅ 已创建使用说明文档")

def create_install_script():
    """创建安装脚本"""
    install_bat = '''@echo off
chcp 65001 >nul
title ETBOX上传工具 - 安装程序

echo ========================================
echo        ETBOX上传工具安装程序
echo ========================================
echo.

echo [信息] 正在检查系统...
python --version >nul 2>&1
if errorlevel 1 (
    echo [警告] 未检测到Python，正在使用打包版本
) else (
    echo [信息] 检测到Python环境
)

echo.
echo [信息] 正在添加右键菜单...

REM 获取当前目录
set "CURRENT_DIR=%~dp0"
set "EXE_PATH=%CURRENT_DIR%ETBOXUploader.exe"

REM 添加右键菜单
reg add "HKEY_CURRENT_USER\\Software\\Classes\\*\\shell\\上传到ETBOX" /ve /d "上传到ETBOX" /f >nul 2>&1
reg add "HKEY_CURRENT_USER\\Software\\Classes\\*\\shell\\上传到ETBOX" /v "Icon" /d "\"%EXE_PATH%\"" /f >nul 2>&1
reg add "HKEY_CURRENT_USER\\Software\\Classes\\*\\shell\\上传到ETBOX\\command" /ve /d "\"%EXE_PATH%\" upload \"%%1\"" /f >nul 2>&1

echo [信息] 右键菜单添加完成!

echo.
echo [信息] 正在创建桌面快捷方式...

set "DESKTOP=%USERPROFILE%\\Desktop"
set "LINK_PATH=%DESKTOP%\\ETBOX上传工具.lnk"

REM 创建桌面快捷方式
powershell -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut('%LINK_PATH%'); $s.TargetPath = '%EXE_PATH%'; $s.Arguments = 'gui'; $s.WorkingDirectory = '%CURRENT_DIR%'; $s.Save()" >nul 2>&1

echo [信息] 桌面快捷方式创建完成!

echo.
echo [信息] 正在启动后台服务...
start "" "%EXE_PATH%" service

echo.
echo [信息] 正在打开配置界面...
start "" "%EXE_PATH%" gui

echo.
echo ========================================
echo           安装完成！
echo ========================================
echo.
echo 使用说明：
echo 1. 桌面有"ETBOX上传工具"快捷方式
echo 2. 右键文件可选择"上传到ETBOX" 
echo 3. 确保ETBOX服务在8812端口运行
echo.
echo 按任意键退出...
pause >nul
'''
    
    with open('安装ETBOX工具.bat', 'w', encoding='gbk') as f:
        f.write(install_bat)
    print("✅ 已创建安装脚本")

def create_portable_version():
    """创建便携版本"""
    portable_dir = "ETBOX上传工具_便携版"
    
    if os.path.exists(portable_dir):
        shutil.rmtree(portable_dir)
    
    os.makedirs(portable_dir)
    
    # 复制文件
    files_to_copy = [
        ('dist/ETBOXUploader.exe', 'ETBOXUploader.exe'),
        ('使用说明.txt', '使用说明.txt')
    ]
    
    for src, dst in files_to_copy:
        if os.path.exists(src):
            shutil.copy2(src, os.path.join(portable_dir, dst))
    
    # 创建便携版启动脚本
    portable_bat = '''@echo off
chcp 65001 >nul
title ETBOX上传工具 - 便携版

echo ========================================
echo       ETBOX上传工具 (便携版)
echo ========================================
echo.

echo [信息] 启动后台服务...
start "" "ETBOXUploader.exe" service

echo [信息] 打开配置界面...
start "" "ETBOXUploader.exe" gui

echo.
echo [信息] 便携版已启动！
echo 右键上传功能需要手动添加：
echo 1. 在配置界面点击"添加右键菜单"
echo 2. 或者运行: ETBOXUploader.exe gui
echo.
pause
'''
    
    with open(os.path.join(portable_dir, '启动便携版.bat'), 'w', encoding='gbk') as f:
        f.write(portable_bat)
    
    print(f"✅ 便携版创建完成: {portable_dir}")

def main():
    print("=" * 50)
    print("      ETBOX上传工具 - 打包程序")
    print("=" * 50)
    print()
    
    # 检查是否在正确的目录
    if not os.path.exists('main.py'):
        print("❌ 错误: 请在项目根目录运行此脚本")
        print("当前目录:", os.getcwd())
        input("按回车键退出...")
        return
    
    # 检查依赖
    if not check_dependencies():
        input("按回车键退出...")
        return
    
    # 选择打包选项
    print("请选择打包选项:")
    print("1. 标准打包 (生成exe + 安装脚本)")
    print("2. 便携版打包")
    print("3. 完整打包 (标准 + 便携版)")
    
    choice = input("请选择 (1-3): ").strip()
    
    if choice not in ['1', '2', '3']:
        print("❌ 无效选择")
        input("按回车键退出...")
        return
    
    # 执行打包
    if build_with_pyinstaller():
        print("\n🎉 打包成功!")
        
        if choice in ['2', '3']:
            create_portable_version()
        
        if choice in ['1', '3']:
            print("\n📁 生成的文件:")
            print("  - dist/ETBOXUploader.exe (主程序)")
            print("  - 安装ETBOX工具.bat (一键安装)")
            print("  - 使用说明.txt (使用说明)")
        
        if choice == '2':
            print("\n📁 生成的文件:")
            print("  - ETBOX上传工具_便携版/ (便携版本)")
        
        if choice == '3':
            print("\n📁 生成的文件:")
            print("  - dist/ETBOXUploader.exe (主程序)")
            print("  - 安装ETBOX工具.bat (一键安装)")
            print("  - 使用说明.txt (使用说明)")
            print("  - ETBOX上传工具_便携版/ (便携版本)")
    
    else:
        print("\n❌ 打包失败!")
    
    print()
    input("按回车键退出...")

if __name__ == "__main__":
    main()